package com.yubest;

/**
 * 给你一个长度为 n 的整数数组，每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,2,3]
 * 输出：3
 * 解释：
 * 只需要3次操作（注意每次操作会增加两个元素的值）：
 * [1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
 * 示例 2：
 * <p>
 * 输入：nums = [1,1,1]
 * 输出：0
 *  
 * <p>
 * 提示：
 * <p>
 * n == nums.length
 * 1 <= nums.length <= 10^5
 * -10^9 <= nums[i] <= 10^9
 * 答案保证符合 32-bit 整数
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author hweiyu
 * @Description
 * @Date 2021/10/20 8:59
 */
public class P0453 {

    public static void main(String[] args) {
        System.out.println(new Solution453().minMoves(new int[]{1, 2, 3}));

        System.out.println(new Solution453().minMoves(new int[]{1, 1, 1}));

        System.out.println(new Solution453().minMoves(new int[]{1, 1, 1000000000}));
    }
}

class Solution453 {

    /**
     * 思路：其实就是追赶问题，从最小数出发，最小数追上其它各个数，计算出要走几步，把这些步数全部累加，就是最终的结果。
     *       找到最小数，然后计算最小数与其它各个数的差，最后累加，就是最终操作次数
     * @param nums
     * @return
     */
    public int minMoves(int[] nums) {
        int total = 0;
        int min = nums[0], index = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < min) {
                min = nums[i];
                index = i;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if (i != index) {
                total += nums[i] - min;
            }
        }
        return total;
    }
}
